package com.xhsj.user.hr.system.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xhsj.user.hr.process.processDefinition.query.MapQuery;
import com.xhsj.user.hr.process.tbLearningGarden.query.NeedLearningListQuery;
import com.xhsj.user.hr.system.dto.UserInfoToAppDto;
import com.xhsj.user.hr.system.dto.UserListDto;
import com.xhsj.user.hr.system.entity.TbGlobalUser;
import com.xhsj.user.hr.system.entity.UserRole;
import com.xhsj.user.hr.system.query.LoadUserInfoQuery;
import com.xhsj.user.hr.system.query.UserBaseQuery;
import com.xhsj.user.hr.system.query.UserListQuery;
import com.xhsj.user.hr.system.query.UserNameInfo;
import com.xhsj.user.hr.system.vo.FindUserListVo;
import com.xhsj.user.hr.system.vo.GetUserInfoByIdVo;
import com.xhsj.user.hr.system.vo.GetUserLoginInfoVo;
import com.xhsj.user.hr.system.vo.UserInfoToAppVo;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.core.parameters.P;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Set;

import java.util.Map;

/**
 * <p>
 * 用户信息表 Mapper 接口
 * </p>
 *
 * @author suxl
 * @since 2020-08-27
 */
@Mapper
public interface TbGlobalUserMapper extends BaseMapper<TbGlobalUser> {

    @Override
    TbGlobalUser selectById(@Param("id") Serializable id);

    TbGlobalUser findByPhoneNumber(@Param("phoneNumber") String phoneNumber);

    // 查询用户信息 不考虑status
    int findByPhoneNumberIsExitWithOutStatus(@Param("phoneNumber") String phoneNumber);

    // 查询用户登录信息
    GetUserLoginInfoVo getUserLoginInfo(@Param("userId") Long userId);

    // 得到对应的处理人根据处理人的角色idS
    Set<String> getFullNameByRoleIds(@Param("roleIdList") List<String> roleIdList);

    // 根据角色id查用户名
    String getFullNameByRoleId(String roleIdList);

    // 得到对应的处理人根据处理人的idS
    Set<String> getFullNameByUserIds(@Param("userIdList") List<String> userIdList);

    // 保存用户角色
    void saveUserRole(@Param("userRoles") List<UserRole> userRoles);

    // 删除用户角色
    void delUserRole(@Param("userId") Long userId);

    // 查询所有用户
    List<MapQuery> getAllUsers();

    // 查询所有用户-包含离职
    List<MapQuery> findAllUsers();

    //获取所有在职用户列表
    List<Map<String, String>> getAllUser();

    // 查询列表
    IPage<FindUserListVo> findList(Page<TbGlobalUser> page,@Param("name") String name);

    // 通过id获取用户信息
    GetUserInfoByIdVo getUserInfoById(@Param("id") String id);

    // 通过用户id查询角色ids
    List<Long> getRoleIdsByUserId(@Param("userId") Long userId);

    // 获取最大的工号
    Long getMaxWorkNum();

    /**
     * 人员列表
     * @author liuqinghua
     * @date Sep 8, 2020 3:02:09 PM
     */
    IPage<UserListQuery> getUserList(Page<UserListQuery> page, @Param("data") UserListDto data);

    /**
     * 我的人员列表
     * @author liuqinghua
     * @date Sep 8, 2020 3:02:09 PM
     */
    List<UserListQuery> getMyUserList(@Param("userId") Long userId, @Param("data") UserListDto data);

    /**
     * 用户基本信息
     * @author liuqinghua
     * @date Sep 8, 2020 3:02:09 PM
     */
    UserBaseQuery getUserBaseQuery(@Param("userId") Long userId);

    // 删除相关的数据
    int deleteDataByUserId(@Param("userId") Long userId);

    /**
     * 查询用户部门职位信息
     * @author 苏小林
     * @date 2020/9/9 9:25
     * @param: userId
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     */
    Map<String, Object> getUserDeptAndPosition(@Param("userId") Long userId);

    /**
     * 获取用户基本信息 用于调岗： 部门 职位 上级领导 薪资
     * @return
     */
    LoadUserInfoQuery loadUserInfo(@Param("userId") Long userId);

    /**
     * 查询在职人员统计
     * @author 苏小林
     * @date 2020/9/14 18:25
     * @param: currentDate
     * @return: java.util.List<java.util.Map>
     */
    List<Map> findInServiceStaff(@Param("date") Date date);

    /**
     * 通过角色id列表查询用户列表
     * @param roleIds
     * @return
     */
    List<Long> getUserListByRoleIds(@Param("roleIds") List<Long> roleIds);

    /**
     * 通过手机号修改密码
     * @author 苏小林
     * @date 2020/9/17 10:30
     * @param: phoneNumber
     * @param: encode
     */
    void updatePwdByPhone(@Param("phone") String phone, @Param("password") String password);

    // 通过权限获取用户
    List<Long> getUserIdByPrem(@Param("perms") String perms);

    /**
     * @Description:  获取在职员工
     * @Param:  无
     * @return:com.xhsj.user.hr.process.processDefinition.query.MapQuery
     * @Author: liuqinghua
     * @Date: 2020/11/10
     */
    List<MapQuery> getOnTheJobEmployees();
    // 上级领导
    Long getLeaderId(@Param("publisherId") Long publisherId);

    /**
     * 通过用户id获取用户手机号码
     * @author 苏小林
     * @date 2020/11/17 9:48
     * @param: userId
     * @return: java.lang.String
     */
    String getPhoneNumberById(@Param("userId") Long userId);

    /**
     * @Description:  获取所有在职员工
     * @Param:  无
     * @return:com.xhsj.user.hr.process.processDefinition.query.MapQuery
     * @Author: liuqinghua
     * @Date: 2020/11/23
     */
    List<Long> getOnTheJobEmployeesUserId();

    // 需学习的总人数
    List<NeedLearningListQuery> getNeedLearningList();

    // 获取所有的部门信息
    List<Map<String,Object>> getAllDept();

    /**
     * 根据用户id查询角色列表
     * @author 苏小林
     * @date 2020/3/17 11:48
     * @param: userId
     * @return: java.util.List<java.lang.String>
     */
    List<String> getRoleListByUserId(@Param("userId") long userId);

    // 根据角色名得到角色id
    List<String> getRoleListByRoleName(@Param("roleName") String roleName);

    // 根据用户id查用户名
    String getFullNameByUserId(String userId);

    // 通过用户id查询部门id列表
    List<String> getDepartIdsByUserId(@Param("userId") long userId);

    // 通过用户id获取角色名称
    List<String> getRoleKeyNamesByUserId(@Param("userId") Long userId);

    // 根据标识得到角色id
    Set<String> getRoleListByRoleKeyName(@Param("roleKeyNameList") List<String> roleKeyNameList);

    // 查询部门下的职位id
    List<Map<String, Object>> getPositionId(@Param("deptId") String deptId);

    // 通过职位id查询用户id
    List<String> getUserIdByPostionId(@Param("positionId") String positionId);

    Long getRoleIdByRoleKeyName(@Param("roleName") String roleName);

    // 得到编写文件得人员的角色是否是对应的角色
    String getCgManager(@Param("userId") String userId,@Param("roleKeyname") String roleKeyname);

    List<TbGlobalUser> getUserListByRoleId(@Param("roleId") String roleId);

    List<TbGlobalUser> getUserListByDeptId(@Param("deptId") String deptId);

    //    供应链得成员
    Set<Map<String, Object>> getMemberList(@Param("deptName") String deptName,@Param("roleKeynameList") List<String> roleKeynameList);

    Map<String, Object> getDeptByUserId(@Param("userId") Long userId);

    // 获取ipr列表
    List<Long> getPatentDepartUserList(@Param("iprName") String iprName);

    // 根据工号查用户名
    String getUserNameByNum(@Param("workNum") String workNum);

    //  获取ipr列表
    List<Map> getPatentDepartUserMap(@Param("iprName") String iprName);

    // 根据角色名称获取用户id
    List<Long> getUserIdByRoleName(@Param("roleKeyname") String roleKeyname);

    // 所有领导用户id
    List<String> getDeptLeaderUserId();

    // 通过用户id查询角色id列表
    List<String> getRoleListByUserIdList(@Param("userList") List<String> userList);

    // 技术负责人的信息
    List<Map<String, Object>> getLeaderUserInfo(@Param("roleName") String roleName);

    // 根据角色获取对应的用户id
    List<String> getUserInfoByRoleId(@Param("roleList") List<Long> roleList);

    // 当前用户信息
    List<Map<Long, Long>> getUserInfo(@Param("userId") Long userId);

    // 获取用户信息根据用户id
    List<TbGlobalUser> getByIds(@Param("userList") List<String> userList);

    /**
     * 删除用户相关数据
     * @author 苏小林
     * @date 2021/2/26 15:12
     * @param: phoneNumber
     */
    void deleteByPhone(@Param("phoneNumber") String phoneNumber);

    /**
     * 修改状态
     * @author 苏小林
     * @date 2021/2/26 15:33
     * @param: phoneNumber
     */
    void updateStatusByPhone(@Param("phoneNumber") String phoneNumber,@Param("status") int status);

    /**
     * 查询用户信息给app
     * @author 苏小林
     * @date 2021/4/7 15:39
     * @param: userId
     * @return: com.xhsj.user.hr.system.vo.UserInfoToAppVo
     */
    UserInfoToAppVo getUserInfoToApp(@Param("userId") Long userId);

       /**
           * @Description: 用户名和用户在职状态
           * @Param:  userId用户id
           * @return:
           * @Author: liuqinghua
           * @Date: 2021/7/21
           */
    UserNameInfo getUserNameInfoByUserId(@Param("userId") Long userId);

    UserInfoToAppDto getDetailUserInfoToApp(@Param("userId") Long userId);

    // 工号校验
    TbGlobalUser findByWorkNum(@Param("workNum") Long workNum);
    // 手机号
    List<Long> getByPhoneNumber(@Param("phoneNumber") String phoneNumber);
}
